package com.pycredit.service;

import java.util.List;
import java.util.Map;

import com.pycredit.bean.CostAnalyzerParam;
import com.pycredit.bean.CostUserAnalyzerParam;
import com.pycredit.bean.ServiceTypePersonCostParam;
import com.pycredit.bean.ServiceTypeSpecialCostParam;
import com.pycredit.exception.BizException;

/**
 * @category 各服务类型成本核算-接口
 * 
 * @author yiz
 * @date 2016年5月24日 下午6:04:27
 * @version 1.0.0 
 * @copyright pycredit.cn 
 */
public interface IServiceTypeCostAnalyzer {

	/**
	 * @category 得到用户成本
	 * @param params
	 * @return
	 * @throws BizException
	 * @throws IllegalAccessException 
	 */
	List<Double> personCostList(List<ServiceTypePersonCostParam> params, int workDay, Map<String, Double> personSalary)
			throws BizException, IllegalAccessException;

	/**
	 * @category 专项支出   服务参数顺序必须为 接口核查（比对）数据量，共享平台数据量，自助核查数据量,批量核查数据量
	 * @param serviceTypeSpecialCostParams
	 * @return
	 * @throws BizException
	 */
	Map<String, Double> specialCostByType(List<ServiceTypeSpecialCostParam> serviceTypeSpecialCostParams)
			throws BizException;

	/**
	 * @category 得到用户成本列表   服务参数顺序必须为 接口核查（比对）数据量，共享平台数据量，自助核查数据量,批量核查数据量
	 * @param params
	 * @return
	 * @throws BizException
	 * @throws IllegalAccessException 
	 */
	Map<String, Double> personCostByType(List<ServiceTypePersonCostParam> params, int workDay,
			Map<String, Double> personSalary) throws BizException, IllegalAccessException;

	/**
	 * @category 运行维护费用核算 sum3：a+b+c+d+e+f；
	 * @param param
	 * @return
	 * @throws BizException 
	 */
	double maintenanceFeeCost(List<Double> fees) throws BizException;

	/**
	 * @category 产品基础成本（1个单位）
	 * @param unitCost 单位运营成本（接口核查等）
	 * @param riskCoeff 风险系数
	 * @return
	 * @throws BizException
	 */
	double baseCost(double unitCost, double riskCoeff) throws BizException;

	/**
	 * @category 服务参数顺序必须为 接口核查（比对）数据量，共享平台数据量，自助核查数据量,批量核查数据量
	 * @param codeCenterTotleFee
	 * @param personTotleFee 2015年所有产品的人员费用合计b
	 * @param dailyFees
	 * @param maintenanceFees
	 * @param serviceNums
	 * @return
	 * @throws BizException 
	 */
	Map<String, Double> businessServiceCostAvgByType(double codeCenterTotleFee, double personTotleFee,
			List<Double> dailyFees, List<Double> maintenanceFees, List<Double> serviceNums, List<Double> dailyFeeRatio,
			double c) throws BizException;

	/**
	 * @category 
	 * @param serviceProductNums 产品数量--接口核查（比对）产品数量，共享平台产品数量，自助核查产品数量，批量核查产品数量，
	 * @param personFees 用户成本列表
	 * @return
	 * @throws BizException
	 */
	double personTotleFee(List<Double> serviceProductNums, List<Double> personFees) throws BizException;

	/**
	 * @category 用户风险评分=(a-0.3317)/0.4484*100=98
	 * @param weight 权重
	 * @return
	 * @throws BizException 
	 */
	double calcUserRiseGrade(double weight) throws BizException;

	/**
	 * @category 用户风险系数=(100（1+R） R^(-1)-用户风险评分)/(100R^(-1) )
	 * @param userRiseGrade 用户风险评分
	 * @param r
	 * @return
	 * @throws BizException 
	 * @throws IllegalAccessException
	 */
	double calcUserRiseCoeff(double userRiseGrade, double r) throws BizException;

	/**
	 * @category 用户风险系数=(100（1+R） R^(-1)-用户风险评分)/(100R^(-1) )
	 * @param userRiseGrade 用户风险评分
	 * @param r
	 * @return
	 * @throws BizException 
	 * @throws IllegalAccessException
	 */
	double calcWeight(CostUserAnalyzerParam costUserAnalyzerParam, List<List<String[]>> userWeightList)
			throws BizException, IllegalAccessException;

	/**
	 * @category 人工比对（核查）成本=10000/350*批量A类人员费用/245
	 * @param dailyDeal 每日处理条数，配置为文件
	 * @param batchFee 批量A类人员费用
	 * @return
	 * @throws BizException
	 */
	double artificialCost(double dailyDeal, double batchFee, double workDay) throws BizException;

	/**
	 * @category  一般变动成本=  单位运营成本 * 产品单位 * 数据量（万条） *字段成本系数 
	 * @param unitOperatingCosts 单位运营成本
	 * @param productNum 产品单位
	 * @param dataNum 数据量（万条）
	 * @param filedType 字段成本系数
	 * @return 一般变动成本
	 */
	double generalChangeCost(double unitOperatingCost, int productNum, double dataNum, double filedVal);

	/**
	 * @category 项目变动成本 = （项目人工成本 + 项目专项支出)* 字段成本系数
	 * @param personCost 项目人工成本
	 * @param specialCost 项目专项支出
	 * @param filedVal 字段成本系数
	 * @return
	 */
	double projectChangeCost(double personCost, double specialCost, double filedVal);

	/**
	 * @category 产品变动成本 = （一般变动成本+项目变动成本*分摊系数） *风险系数 ,机器处理成本
	 * @param generalChangeCost 一般变动成本
	 * @param projectChangeCost 项目变动成本
	 * @param sharingcoeff 分摊系数
	 * @param userRiskcoeff 用户风险系数 
	 * @param riskcoeff 风险控制成本系数
	 * @return
	 */
	double productChangeCost(double generalChangeCost, double projectChangeCost, double sharingcoeff, double riskcoeff);

	/**
	 * @category 批量核查人工处理成本=数据量*查询质量*人工比对（核查）成本
	 * @param dataNum 数据量
	 * @param quality 查询质量
	 * @param personCompareCost 人工比对（核查）成本
	 * @return
	 */
	double personDealCost(double dataNum, double quality, double personCompareCost);

	/**
	 * @category 产品成本 = 产品基础成本 + 产品变动成本
	 * @param baseProductCost 产品基础成本
	 * @param productChangeCost 产品变动成本
	 * @return
	 */
	double productCost(double baseProductCost, double productChangeCost);

	/**
	 * @category 产品成本=人工处理成本 +机器处理成本
	 * @param personDealCost 批量核查人工处理成本
	 * @param productChangeCost 机器处理成本
	 * @return
	 */
	double productCostBatch(double personDealCost, double productChangeCost);

	/**
	 * @category 客户项目价格 = 产品成本 * 利润附加比例 * 用户风险系数
	 * @param productCost 产品成本
	 * @param profitRatio 利润附加比例 
	 * @param userRiskcoeff 用户风险系数
	 * @return
	 */
	double customProductPrice(double productCost, double profitRatio, double userRiskcoeff);

	/**
	 * @category 得到最后计算的参数列表
	 * @param costAnalyzerParams
	 * @return
	 * @throws BizException 
	 */
	List<CostAnalyzerParam> getLastCostAnalyzerParam(List<CostAnalyzerParam> costAnalyzerParams) throws BizException;

}
